package org.spring.core.annotation;

import org.spring.core.Ordered;

import java.lang.annotation.*;

/**
 * {@code @Order}定义了一个带注释组件的排序顺序。
 *
 * <p>{@link #value()}是可选的，表示在{@link Ordered}接口中定义的顺序值。
 * 值越小优先级越高。
 * 默认值为{@code Ordered.LOWEST_PRECEDENCE}，表示最低优先级(低于任何其他指定的顺序值)。
 * <p>
 * 注:从Spring 4.0开始，Spring中很多类型的组件都支持基于注释的排序，
 * 甚至包括目标组件的顺序值被考虑在内的集合注入(不管是来自它们的目标类还是它们的{@code @Bean}方法)。
 * 虽然这些顺序值可能会影响注入点的优先级，但请注意，它们不会影响单例启动顺序，
 * 单例启动顺序是由依赖关系和{@code @DependsOn}声明确定的正交问题(影响运行时确定的依赖图)。
 *
 * <p>从Spring 4.1开始，标准的{@link javax.annotation.Priority}注释可以在排序场景中作为该注释的替代。
 * 注意，当必须选择单个元素时，{@code @Priority}可能有额外的语义(参见{@link AnnotationAwareOrderComparator#getPriority})。
 *
 * <p>或者，顺序值也可以通过{@link Ordered}接口在每个实例的基础上确定，允许配置确定实例值，而不是硬编码的值附加到特定的类。
 *
 * <p>有关非有序对象的排序语义的详细信息，请咨询javadoc中的{@link OrderComparator OrderComparator}。
 *
 * @author 李坤
 * @date 2022/4/23 18:40
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
public @interface Order {

    /**
     * order 的值。
     * <p>默认为{@link Ordered.LOWEST_PRECEDENCE}。
     *
     * @see Ordered#getOrder()
     */
    int value() default Ordered.LOWEST_PRECEDENCE;

}
